1. Инвалидирование итераторов При vector::erase все итераторы от позиции удаления до end() становятся «битые». Чтобы безопасно отфильтровать и удалить элементы, пользуйтесь erase–remove идиомой:
auto it = std::remove_if(v.begin(), v.end(), [](int x){ return x < 0; }); v.erase(it, v.end());
remove_if сдвигает «хвост» вперёд, но не меняет размер контейнера.
2. reserve vs resize
* v.reserve(n) выделяет память, но не создаёт объектов → size() не меняется, можно безопасно push_back. * v.resize(n) создаёт n элементов, инициализированных значениями по умолчанию.
3. Производительность std::distance На random-access итераторах (например, vector) это O(1), а на bidirectional или forward (например, list) — O(n). Для списков используйте size() (C++11+) или считайте вручную в критичных местах.
4. emplace_back vs push_back При сложных типах emplace_back может избежать лишнего копирования:
v.emplace_back(ctor_arg1, ctor_arg2); // vs v.push_back(MyType(ctor_arg1, ctor_arg2));
5. Памятка про компараторы В set или map ваш компаратор должен задавать строгий-уровень-менее (operator<): если comp(a,b)==true, то comp(b,a) обязан быть false. Иначе — UB.
Быстро, без воды, но с пользой — проверяйте эти моменты в своём коде!
1. Инвалидирование итераторов При vector::erase все итераторы от позиции удаления до end() становятся «битые». Чтобы безопасно отфильтровать и удалить элементы, пользуйтесь erase–remove идиомой:
auto it = std::remove_if(v.begin(), v.end(), [](int x){ return x < 0; }); v.erase(it, v.end());
remove_if сдвигает «хвост» вперёд, но не меняет размер контейнера.
2. reserve vs resize
* v.reserve(n) выделяет память, но не создаёт объектов → size() не меняется, можно безопасно push_back. * v.resize(n) создаёт n элементов, инициализированных значениями по умолчанию.
3. Производительность std::distance На random-access итераторах (например, vector) это O(1), а на bidirectional или forward (например, list) — O(n). Для списков используйте size() (C++11+) или считайте вручную в критичных местах.
4. emplace_back vs push_back При сложных типах emplace_back может избежать лишнего копирования:
v.emplace_back(ctor_arg1, ctor_arg2); // vs v.push_back(MyType(ctor_arg1, ctor_arg2));
5. Памятка про компараторы В set или map ваш компаратор должен задавать строгий-уровень-менее (operator<): если comp(a,b)==true, то comp(b,a) обязан быть false. Иначе — UB.
Быстро, без воды, но с пользой — проверяйте эти моменты в своём коде!
The campaign, which security firm Check Point has named Rampant Kitten, comprises two main components, one for Windows and the other for Android. Rampant Kitten’s objective is to steal Telegram messages, passwords, and two-factor authentication codes sent by SMS and then also take screenshots and record sounds within earshot of an infected phone, the researchers said in a post published on Friday.
Should You Buy Bitcoin?
In general, many financial experts support their clients’ desire to buy cryptocurrency, but they don’t recommend it unless clients express interest. “The biggest concern for us is if someone wants to invest in crypto and the investment they choose doesn’t do well, and then all of a sudden they can’t send their kids to college,” says Ian Harvey, a certified financial planner (CFP) in New York City. “Then it wasn’t worth the risk.” The speculative nature of cryptocurrency leads some planners to recommend it for clients’ “side” investments. “Some call it a Vegas account,” says Scott Hammel, a CFP in Dallas. “Let’s keep this away from our real long-term perspective, make sure it doesn’t become too large a portion of your portfolio.” In a very real sense, Bitcoin is like a single stock, and advisors wouldn’t recommend putting a sizable part of your portfolio into any one company. At most, planners suggest putting no more than 1% to 10% into Bitcoin if you’re passionate about it. “If it was one stock, you would never allocate any significant portion of your portfolio to it,” Hammel says.